import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author xhw
 */

public class DataPivotTableView {
    //这个类是一个数据透视表，包含了一行一行的数据都是List<Srting>的数据
    private List<String[]> rows = new ArrayList<>();

    public static DataPivotTableView of(List<String[]> strings) {
        DataPivotTableView dataPivotTableView = new DataPivotTableView();
        dataPivotTableView.rows.addAll(strings);
        return dataPivotTableView;
    }

    //添加一行数据（要兼容性强，那么就不止只是一个数组，还要可以接受其他类型的数据）
    public void addRow(Iterator<String> values) {
        final String[] row = toArray(values);
        this.rows.add(row);
    }

    private String[] toArray(Iterator<String> values) {
        //这个方法是将一个迭代器转换为一个数组
        //先判断迭代器是否为空，然后遍历迭代器，将值放入数组
        if (values == null) {
            throw new IllegalArgumentException("values is null");
        }
        if (!values.hasNext()) {
            throw new IllegalArgumentException("values is empty");
        }
        if (values instanceof List) {
            return ((List<String>) values).toArray(new String[0]);
        } else {
            List<String> list = new ArrayList<>();
            while (values.hasNext()) {
                list.add(values.next());
            }
            return list.toArray(new String[0]);
        }
    }

    //设置表头
    public void setColumns(Iterator<String> values) {
        //设置表头
        final String[] row = toArray(values);
        this.rows.add(0, row);
    }

    //获取表头
    public List<String> getColumns() {
        //获取表头
        return List.of(this.rows.get(0));
    }

    //获取所有的行数据
    public List<String[]> getRows() {
        //获取所有的行数据
        return new ArrayList<>(this.rows.subList(1, this.rows.size()));
    }

    //获取行数据
    public List<String> getRow(int index) {
        //获取行数据
        return List.of(this.rows.get(index));
    }

    //因为是一个数组不是单个的值，所以要重写equals方法
    @Override
    public boolean equals(Object o) {
        if (!(o instanceof DataPivotTableView other))
            return false;

        List<String[]> otherRows = other.rows;
        if (this.rows.size() != otherRows.size())
            return false;

        for (int i = 0; i < this.rows.size(); i++) {
            if (!List.of(this.rows.get(i)).equals(List.of(otherRows.get(i)))) {
                return false;
            }
        }
        return true;
    }

    //重写toString方法
    @Override
    public String toString() {
        return rows.stream().map(row -> String.join(",", row)).collect(Collectors.joining("\n"));
    }

    public void setHeader(List<String> header) {
        //设置表头
        this.rows.add(0, header.toArray(new String[0]));
    }
}
